package com.bm.util;

import io.jsonwebtoken.*;

import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Map;

//提供了创建、解析和验证 JWT 的功能。
public class JwtUtil {
    //静态变量
    private static Long tokenExpireTime = 24 * 60 * 60 * 1000L; //有效期24小时
    //用于签名和验证JWT的密钥
    private static String tokenSecret = "pwd";
    //指定JWT的签名算法
    private static final SignatureAlgorithm JWT_ALG = SignatureAlgorithm.HS256; //对称加密算法（简单场景）
    //HTTP请求头部格式
    private static String jwtSeparator = "Bearer#";//前缀

    //根据 tokenSecret 和签名算法生成一个密钥对象。
    //使用 SecretKeySpec 将密钥字符串转换为适合签名的密钥格式
    private static Key generateKey() {
        byte[] bytes = tokenSecret.getBytes();
        return new SecretKeySpec(bytes, JWT_ALG.getFamilyName());
    }
    //生成一个完整的 JWT 令牌

    /**
     * @param sub 面向的用户  （用户名)
     * @param map 自定义信息  (用户对象的map存储格式)
     * @return Token字符串
     */
    public static String creatToken(String sub, Map<String, Object> map) {
        JwtBuilder builder = Jwts.builder(); //  创建 JWT 构建器
        if (map != null && !map.isEmpty()) {
            builder.setClaims(map); //  将 map 中的键值对设为 JWT 的 Payload（声明）
        }
        return builder
                .setSubject(sub)
                .signWith(SignatureAlgorithm.HS256, generateKey())
                .compact();
    }
    //解析 JWT 令牌并返回 Jws<Claims> 对象。

    /**
     * 解析token              头部      载荷和签名的对象。
     * 可根据Jws<Claims>  获取 header /body/getSignature 三部分数据
     * body :，通过map添加——Map对象信息以及token一些额外信息的Map对象，可直接转换回JavaBean
     *
     * @param token token字符串
     * @return Jws
     */
    public static Jws<Claims> parseToken(String token) {
        token = token.replaceFirst(jwtSeparator, "");
        return Jwts.parser().setSigningKey(generateKey()).parseClaimsJws(token);
    }

    //检查令牌是否有效。
    public static Boolean checkToken(String token) {
        return parseToken(token).getBody() != null;
    }
    //检查令牌是否属于指定用户 (没写)
}
